package controllers.entorno;

import org.hibernate.Session;
import org.hibernate.Transaction;

import hbm.BaseHibernateDAO;

public abstract class PaginaDetalle<T> extends PaginaBase {

	private T registro;
	protected String reglaListado = "listado";

	private boolean esEditar;
	protected BaseHibernateDAO dao;

	public PaginaDetalle(BaseHibernateDAO dao) {
		this.dao = dao;
	}

	public abstract void editar(T registro, Session session) throws Exception;
	
	public abstract void eliminar(T registro, Session session) throws Exception;

	public boolean getEsEditar() {
		return esEditar;
	}

	public T getRegistro() {
		return registro;
	}

	public abstract void guardar(T registro, Session session) throws Exception;

	public String irEditar() {
		try {
			Session session = dao.getSession();
			try {
				boolean error = false;
				Transaction tx = session.beginTransaction();
				try {
					editar(getRegistro(), session);
				} catch (Exception e) {
					error = true;
					throw e;
				} finally {
					if (!error) {
						tx.commit();
					} else {
						tx.rollback();
					}
				}
			} finally {
				session.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
			mensaje("Ocurrio un error al editar el registro");
			return "";
		}
		return reglaListado;
	}

	public String irEliminar() {
		try {
			Session session = dao.getSession();
			try {
				boolean error = false;
				Transaction tx = session.beginTransaction();
				try {
					eliminar(getRegistro(), session);
				} catch (Exception e) {
					error = true;
					throw e;
				} finally {
					if (!error) {
						tx.commit();
					} else {
						tx.rollback();
					}
				}
			} finally {
				session.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
			mensaje("Ocurrio un error al eliminar el registro");
			return "";
		}
		return reglaListado;
	}

	public String irGuardar() {
		try {
			Session session = dao.getSession();
			try {
				boolean error = false;
				Transaction tx = session.beginTransaction();
				try {
					guardar(getRegistro(), session);
				} catch (Exception e) {
					error = true;
					throw e;
				} finally {
					if (!error) {
						tx.commit();
					} else {
						tx.rollback();
					}
				}
			} finally {
				session.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
			mensaje("Ocurrio un error al guardar el registro");
			return "";
		}
		return reglaListado;
	}

	public void setEsEditar(boolean esEditar) {
		this.esEditar = esEditar;
	}

	public void setRegistro(T registro) {
		this.registro = registro;
	}

}
